const fs = require('fs');
// 升级写法：发布订阅模式：，注：先订阅-》再发布

// 发布订阅实现了解耦

// 发布订阅模式： 核心就是把多个方法先暂存起来，最后一次执行

// 先要有个事件中心
let events = {
  _event: [],
  on(fn) {
    this._event.push(fn);
  },
  emit(data) {
    this._event.forEach(fn => fn(data)); // 将传进来的函数都执行
  },
};

// 订阅有顺序，可以采用数组来控制，（因为每完成一次就会触发，能记录下来）
events.on(() => {
  // 每读一次，就触发一次
  console.log('每读一次，就触发一次');
});
let arr = [];
events.on(data => {
  arr.push(data);
  // 最终结果还是计数器
  if (arr.length === 2) {
    console.log('读取完毕', arr);
  }
});

fs.readFile('./a.txt', 'UTF8', function (err, data) {
  events.emit(data); // 每完成就触发一次
});

fs.readFile('./b.txt', 'UTF8', function (err, data) {
  events.emit(data); // 每完成就触发一次
});

/**
 * 观察者模式：vue2里面用的多，基于发布订阅来实现的（发布订阅之间是没有依赖关系的）
 *
 *对于我们的观察者模式：有两种状态：观察者   被观察者 （vue3中没有使用class）
 *
 *
 *
 */
